Dataformでコンパイル変数を使ってみた
データアナリティクス事業本部の根本です。Dataformを使っていて、呼び出しもと(Workflowsとか)から動的に値を変えてDataformを呼び出すことができたらいいなと思い調べてみたらコンパイル変数を用いたらできたので記事にしてみました。
この記事の対象者
- Dataformでコンパイル変数を使ってみたいひと
前提条件
- Dataformのワークスペースやリポジトリが存在する、使えること
検証の全体像
- コンパイル変数を
dataform.json
で指定して動作するか確認 - APIでDataformを実行するときにコンパイル変数の値を上書きして動作するか確認
上記2つの検証をしていきます。
やってみる
それでは早速やっていきます。
コンパイル変数をdataform.jsonに定義する
今回定義したdataform.json
は以下です。
{ "defaultSchema": "BQのデータセット名", "assertionSchema": "dataform_assertions", "warehouse": "bigquery", "defaultDatabase": "project-id", "defaultLocation": "region", "vars": {"sample_val":"123"} }
"vars": {"sample_val":"123"}
←これがコンパイル変数の定義部分になります。リファレンスを元に実装しました。
今回定義したコンパイル変数は、デフォルト値が123
となります。
コンパイル変数が動作するかテストしてみる
まずは設定したコンパイル変数が動作するかを確認するため、SQLXファイルで使用してみます。コンパイル変数はdefinitions
配下のSQLXファイルで使用することができます。
以下が定義したSQLXファイルです。
config { type: "view" } SELECT ${dataform.projectConfig.vars.sample_val} AS compile_val_test_view
${dataform.projectConfig.vars.変数名}
で、dataform.json
で定義したコンパイル変数を取得することができます。
それではコミットして、Dataformワークフローを実行してみます。
Viewが作成されて、コンパイル変数に設定したデフォルト値123
が列の値として出力されました。コンパイル変数を使えることが確認できてよかったです。
続いて、APIでコンパイル変数を上書きしてDataformワークフローを実行できるか確認してみます。
API実行してみる
DataformのAPI実行に関してよくわからない人は、このブログを見てみてください。
それではコンパイルをします。コンパイル用のコマンドは以下となります。
curl -X POST https://dataform.googleapis.com/v1beta1/projects/*project-id*/locations/asia-northeast1/repositories/*repo-name*/compilationResults \ --header "Authorization: Bearer $(gcloud auth print-access-token)" \ --header "Content-Type: application/json" \ --data '{"gitCommitish":"main", "codeCompilationConfig":{"vars":{"sample_val":"9999"}}}'
"codeCompilationConfig":{"vars":{"sample_val":"9999"}}
:この部分が重要です。
コンパイル時に、コンパイル変数を上書きするためcodeCompilationConfig
を設定し、コンパイル変数に999
の値を設定しました。リファレンス
dataform.json
で宣言したsample_val変数
のデフォルト値に設定した値は123
でしたが、上記コマンドでコンパイル時に9999
を指定しました。
このコンパイル結果を元に実行して、作成されたViewの列の値が9999
となっていれば検証は成功するという寸法です。
それではコンパイル結果を元にDataformワークフローを実行します。実行は以下のコマンドです。
curl "https://dataform.googleapis.com/v1beta1/projects/*project-id*/locations/asia-northeast1/repositories/*repo-name*/workflowInvocations" \ --header "Authorization: Bearer $(gcloud auth print-access-token)" \ --header 'Content-Type: application/json' \ --data '{"compilationResult":"projects/*project-id*/locations/asia-northeast1/repositories/*repo-name*/compilationResults/75cb3271-4654-4ba3-88ad-1a3ac97d08e7"}'
compilationResult
には、コンパイル用コマンドのレスポンスのname
の値を指定します。
コマンドが成功したら、Dataformのコンソールから、実行されたかどうか確認してみます。
無事実行されていて、完了していました。
それではViewもみてみます。
9999
が設定されていることが確認できました。
デフォルト値 | コンパイル時の指定値 |
---|---|
123 | 9999 |
上記としていたので、コンパイル時にdataform.json
で定義したコンパイル変数の値をコンパイル時に上書きできることが確認できました!
所感
コンパイル時に、変数の値を上書きできるということはDataformをWorkflowsやCloud Functionsなどから呼び出す際にとても嬉しい機能だと考えます。日付を指定したり、前工程の処理結果を指定したり、環境(prod,stg)を指定したり、など。ワークロードによりけりですが、今後Dataformを活用する上ではぜひ覚えておきたい機能だと思いました。
この記事が、どなたかのお役に立てば嬉しいです。それではまた。
参考
カスタム コンパイル変数を作成する
コンパイル実行APIのリファレンス
Dataformワークフロー実行APIのリファレンス